
package ija.configuration;

import ija.model.players.Player;
import ija.model.players.RemotePlayer;
import ija.xls.notation.NotationReaderFactory;
import ija.xls.xml.config.ConfigReaderWriter;
import ija.xls.xml.config.PlayersReaderWriter;
import java.io.IOException;
import java.util.Iterator;
import org.dom4j.DocumentException;

/**
 * Trida je zodpovedna za nacitani a ulozeni konfigurace.
 * Je implementovana pomoci navrhoveho vzoru Singleton.
 * 
 * @author Radek Necas, xnecas18
 */
public class Config {

    static protected Config instance;
    
    protected ConfigReaderWriter rwConfig;
    protected PlayersReaderWriter rwPlayers;
    
    
    /**
     * Konstruktor vytvori novou konfigurace. 
     * Konfiguracni xml soubory maji vychozi nazvy a umisteni.
     * @throws DocumentException 
     */
    public Config() throws DocumentException {
        rwConfig = new ConfigReaderWriter();
        rwConfig.initInput();
        
        rwPlayers = new PlayersReaderWriter();
        rwPlayers.init();
    }
    
    /**
     * Metoda pro ziskani instance.
     * Uchovava se pouze jedna instance tridy (Singleton).
     * @return instanci nove tridy nebo jiz vytvorene
     * @throws DocumentException 
     */
    static public Config getInstance() throws DocumentException {
        if(instance == null)
            return new Config();
        else
            return instance;
    }
    
    /**
     * Metoda slouzi pro ziskani vsech poslednich hracu
     * @return iterator pres vsechny posledni hrace
     */
    public Iterator<Player> lastPlayersIterator() {
        return rwPlayers.lastPlayersIterator();
    }
    
    /**
     * Metoda slouzi pro ziskani vsech ulozenych vzdalenych hracu
     * @return iterator pres vsechny ulozene vzdalene hrace
     */
    public Iterator<Player> storePlayersIterator() {
        return rwPlayers.storePlayersIterator();
    }
    
    /**
     * Metoda ulozi hrace jako posledni ulozene
     * @param p0 hrac s id 0
     * @param p1 hrac s id 1
     */
    public void saveLastGamePlayers(Player p0, Player p1) {
        rwPlayers.saveLastPlayers(p0, p1);
    }
    
    /**
     * Metoda prida dalsiho hrace mezi ulozene
     * @param p vzdaleny hrac, ktery se bude ukladat
     */
    public void addStorePlayer(RemotePlayer p) {
        rwPlayers.addStorePlayer(p);
    }
    
    /**
     * 
     * @return cesta k obr s bilym kamenem
     */
    public String getPieceWhite() {
        return rwConfig.getPieceWhite();
    }
    
    /**
     * 
     * @return cesta k obr s cernym kamenem
     */
    public String getPieceBlack() {
            return rwConfig.getPieceBlack();
    }
    
    /**
     * 
     * @return cesta k obr s bilou damou
     */
    public String getQueenWhite() {
        return rwConfig.getQueenWhite();
    }
    
    /**
     * 
     * @return cesta k obr s cernou damou
     */
    public String getQueenBlack() {
        return rwConfig.getQueenBlack();
    }
    
    /**
     * 
     * @return cesta k obr s pozadim desky
     */
    public String getBackGround() {
        return rwConfig.getBackGround();
    }
    
    /**
     * 
     * @return cesta ke slozce, kde se ukladaji ulozene hry (relativni vzhledem k build.xml)
     */
    public String getSaveGamePath() {
        return rwConfig.getSaveGame();
    }
    
    /**
     * 
     * @return cesta ke slozce, kde se ukladaji hraci (relativni vzhledem k build.xml)
     */
    public String getStorePlayersPath() {
        return rwConfig.getStorePlayers();
    }
    
    /**
     * 
     * @return typ pouzite notace
     */
    public NotationReaderFactory.NotationType getNotationType() {
        return NotationReaderFactory.NotationType.getFromString(
                rwConfig.getNotationType());
    }
    
    /**
     * Metoda ulozi konfiguraci a hrace do vychozich souboru xml.
     * @throws IOException 
     */
    public void writeToFiles() throws IOException {
        rwConfig.writeToFile();
        rwPlayers.writeToFile();
    }
}
